home *** CD-ROM | disk | FTP | other *** search
/ The Guided Tour of Multimedia (Second Edition) / The Guided Tour of Multimedia (Second Edition).iso / trials / director / evalcopy / director.z / MECH.DIR / 00077_Script_aAnimator < prev    next >
Text File  |  1994-06-14  |  28KB  |  738 lines

  1. --òò The central Animator script òòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòò
  2. global gConstrainSprite 
  3. property  theDelay,delayCounter,nGears,maxGears,gearList,nBalls,maxBalls,myBallList,¼
  4.            maxParts,nParts,nextPChannel,nextGChannel,myPartsList,myMotor,mySpeed,¼
  5.            initGearChannel,initBallChannel,initPartChannel, testList,¼
  6.            smGearID,lgGearID,bltGearID,pshGearID,teeID,chuteID,nSlopeID,pSlopeID
  7.  
  8. on birth me
  9.   -- EACH PART HAS AN ID. used for save / open to identify the part in the file
  10.   set lgGearID = 1
  11.   set smGearID = 2
  12.   set pshGearID = 3
  13.   set bltGearID = 4
  14.   set teeID = 5
  15.   set chuteID = 6
  16.   set nSlopeID = 7
  17.   set pSlopeID = 8
  18.   
  19.   -- init the ball, gear, and part list and channel boundry vars 
  20.   set nBalls = 0
  21.   set maxBalls = 1
  22.   set initBallChannel = 9
  23.   set nextBChannel = initBallChannel
  24.   
  25.   set nGears = 0                     -- holds the current gear count
  26.   set maxGears = 4                   -- max number of gears, counting the Motor gear
  27.   set initGearChannel = 4            -- 1st gear channel,holds Motor gear, build 
  28.   -- from here on down to max
  29.   set nextGChannel = initGearChannel -- next available channel for a gear part
  30.   
  31.   set nParts = 0                     -- holds the current parts count
  32.   set maxParts = 9                   -- max number of parts, counting the vac chute
  33.   set initPartChannel = 11           -- 1st part channel,holds vac chute, build 
  34.   -- from here on down to max
  35.   set nextPChannel = initPartChannel -- next available channel for a part
  36.   
  37.   set mySpeed = 0                    -- initial speed is 0, connects control to gear rotation
  38.   puppetSprite 27, TRUE              -- holds the speed control device
  39.   
  40.   -- create the list to hold gears
  41.   set gearList = [] -- empyt list at first, motor gear will be the first gear in list
  42.   -- Create a Motor Gear  , birth a new offspring from the "aGear" script
  43.   -- Motor gear artwork starts at cast 591. 3 gears per animation, geartype = lgGearID
  44.   set myMotor = birth (script "aGear",nextGChannel,211,3,lgGearID)
  45.   mAddToGearList( me,myMotor)       -- holds the list of gears for animation.
  46.   mSetEngaged ( myMotor,TRUE)       -- gears that are engaged are powered = they turn.
  47.   
  48.   -- Create a ball list and balls.
  49.   set myBallList = []
  50.   
  51.   set theDelay = 8
  52.   set delayCounter = 8
  53.   -- build the parts list
  54.   set   myPartsList = []
  55.   
  56.   put mIncBallNumber (me) into thisPart
  57.   
  58.   if objectp(thisPart)  then
  59.     set theSprite =  mGetSprite (thisPart )
  60.     put the width of sprite  gConstrainSprite into theWidth
  61.     set theCenter = (the left of sprite gConstrainSprite) + theWidth/2
  62.     set the locV of sprite nBalls + initBallChannel =¼
  63.             (the top of sprite  gConstrainSprite) + 50
  64.     set the locH of sprite nBalls + initBallChannel = theCenter + 108
  65.   end if
  66.   return me
  67. end birth
  68.  
  69. --=================================================================
  70. -- This handler takes a part number, calls the mNewPart handler
  71. -- to get a new part and puts it on the stage relative to the mouseH.
  72. -- If a part could not be created FALSE is returned. If the part
  73. -- was created the this handler returns TRUE
  74. on mCreatPart me, partNumber 
  75.   set thisSprite = mNewPart (me,partNumber) 
  76.   -- Test to see if the animator was able to create a new part
  77.   if thisSprite then
  78.     --put this part on the stage 
  79.     set the locH of sprite thisSprite = the mouseH
  80.     set the locV of sprite thisSprite = 200
  81.     set the mouseUpScript to "snapToBoard"
  82.     return TRUE 
  83.   else
  84.     return FALSE
  85.   end if
  86. end mCreatPart
  87.  
  88. --=================================================================
  89. -- This handler takes a part number (1 - 8 ) as a parameter and
  90. -- births a new part based upon that number. If the part interacts
  91. -- with the ball then the mAddToPartsList handler is called. If the
  92. -- part is a gear the mAddToGearList handler is called. The channel 
  93. -- that holds the sprite is determined by calling mGetNextChannel or
  94. -- mGetNextGearChannel handler. Then the handler returns the channel
  95. -- number.
  96. on mNewPart me, partNumber
  97.   set thisPart = 0
  98.   if partNumber = 8 then
  99.     -- build up sloped slide
  100.     set theChannel = mGetNextChannel ( me )
  101.     if theChannel <> 0 then
  102.       set  thisPart = birth (script "aPChute" , theChannel,pSlopeID)
  103.       mAddToPartsList (me,thisPart)
  104.     end if
  105.   else
  106.     if partNumber = 7 then
  107.       -- build dwn sloped slide
  108.       set theChannel = mGetNextChannel ( me  )
  109.       if theChannel <> 0 then
  110.         set  thisPart = birth (script "aNChute" , theChannel,nSlopeID)
  111.         mAddToPartsList (me,thisPart)
  112.       end if
  113.     else
  114.       if partNumber = 6 then
  115.         --pusher gear
  116.         set theChannel = mGetNextGearChannel ( me )
  117.         if theChannel <> 0 then
  118.           set thisPart = birth (script "aGear" , theChannel,221,24,3 )
  119.           mAddToPartsList( me,thisPart)
  120.           mAddToGearList (me,thisPart)
  121.         end if
  122.       else 
  123.         if partNumber = 5 then
  124.           -- build a slide Chute
  125.           set  theChannel = mGetNextChannel (me)
  126.           if theChannel <> 0 then
  127.             set thisPart = birth (script "aChute" , theChannel,chuteID)
  128.             mAddToPartsList (me,thisPart)
  129.           end if
  130.         else
  131.           if partNumber = 4 then
  132.             -- build horz  Belt
  133.             set theChannel = mGetNextGearChannel ( me )
  134.             if theChannel <> 0 then
  135.               set thisPart = birth (script "aGear" ,theChannel,181,1,4)
  136.               mAddToGearList (me,thisPart)
  137.             end if
  138.           else
  139.             if partNumber = 3 then
  140.               -- large gear
  141.               set  theChannel = mGetNextGearChannel( me )
  142.               if theChannel <> 0 then
  143.                 set thisPart = birth (script "aGear" ,theChannel,191,3,1)
  144.                 mAddToGearList (me,thisPart)
  145.               end if
  146.             else
  147.               if partNumber = 2 then
  148.                 -- small gear
  149.                 set theChannel =  mGetNextGearChannel (me )
  150.                 if theChannel <> 0 then
  151.                   set thisPart = birth (script "aGear" ,theChannel,201,3,2)
  152.                   mAddToGearList (me,thisPart)
  153.                 end if
  154.               else
  155.                 if partNumber = 1 then
  156.                   -- build a Tee Chute
  157.                   set theChannel = mGetNextChannel( me )
  158.                   if theChannel <> 0 then
  159.                     set thisPart = birth (script "aTeeChute" , theChannel,teeID) 
  160.                     mAddToPartsList (me,thisPart)
  161.                   else 
  162.                     set theChannel = 0
  163.                   end if
  164.                 end if
  165.               end if
  166.             end if
  167.           end if  
  168.         end if
  169.       end if
  170.     end if
  171.   end if
  172.   return theChannel 
  173. end mNewPart
  174.  
  175. --================================================================= 
  176. -- Manages the channel allocation of parts sprite. Just fill
  177. -- up the channels starting witn the initpartChannel up to
  178. -- the initPartChannel + maxParts. If we are full we return
  179. -- 0. Otherwise we return the channel.
  180. on mGetNextChannel me
  181.   if nextPChannel > initPartChannel + maxParts then
  182.     return 0
  183.   else
  184.     set nextPChannel = nextPChannel + 1
  185.     return nextPChannel
  186.   end if
  187. end mGetNextChannel
  188.  
  189. --=================================================================
  190. -- Manages the channel allocation of gear sprite. Just fill
  191. -- up the channels starting witn the initpartChannel up to
  192. -- the initPartChannel + maxParts. If we are full we return
  193. -- 0. Otherwise we return the channel.
  194. on mGetNextGearChannel me
  195.   if nextGChannel >= initGearChannel + maxGears then
  196.     return 0
  197.   else
  198.     set nextGChannel = nextGChannel + 1
  199.     return nextGChannel
  200.   end if
  201. end mGetNextGearChannel
  202.  
  203. --================================================================= 
  204. -- This handler manages the speed control. The mouse position
  205. -- is determined relative to the general height of the sprite
  206. -- and a cast (PICT) is selected for the sprite.
  207. -- The delay property var is set to a value of 0 - 7.
  208.  
  209. on mSetSpeed me
  210.   put the mouseV into vertPos
  211.   -- each cast member in this animation has a different height,
  212.   -- so I have experimented and I've found the following numbers
  213.   -- yeild the best results for this control
  214.   set  bottomRange = 290
  215.   set totalRange = 35
  216.   set delta = totalRange / 7
  217.   set rangeMark = (((vertPos - bottomRange) / delta))
  218.   set rangeMark = min(rangeMark,7)
  219.   if rangeMark < 0  then set rangeMark = 0
  220.   set newCast = (158 - rangeMark) 
  221.   
  222.   put the castNum of sprite 27 into currentCast
  223.   if currentCast > newCast then 
  224.     set fDelta = -1
  225.   else
  226.     set fDelta = 1
  227.   end if
  228.   repeat while currentCast <> newCast
  229.     set currentCast = currentCast + fDelta
  230.     set the castNum of sprite 27 = currentCast
  231.     updateStage
  232.   end repeat
  233.   
  234.   set mySpeed = rangeMark
  235.   set theDelay = mySpeed
  236.   set delayCounter = theDelay
  237. end mSetSpeed
  238. --================================================================= 
  239. -- This handler is easy to descripbe but is a bit complex in nature.
  240. -- We take a sprite as theBase, and search the gear list to see
  241. -- if we are touching any of the gears in the list. The base is assumed 
  242. -- to be engaged (powered) and we want to produce a list of
  243. -- the gears that we are touching. We also wish to set the engaged property
  244. -- var of the gears that the base is touching so that these gears are
  245. -- also powered. Gears are touching if they intersect, and are at
  246. -- the same locV or locH positions and the two gears do not over 
  247. -- lape by more then the pixel depth of the gear tooth depth.
  248. -- Run the Simulation and place a gear on the peg board. Move it
  249. -- to peg positions on the horizontal and vertial axis of the
  250. -- motor gear and see when it is and is not engaged. This handler
  251. -- is determining engagment.
  252. on mSearchBase me,theBase , retList
  253.   -- find all gears that ar touching this base gear
  254.   -- and store the gear(s) in the retList
  255.   set retIndex = 1
  256.   setAt(retList,retIndex,0)
  257.   set gearCount =  nGears  -- this is set to the number of gears in the list
  258.   set nextGearCount = initGearChannel + 1 -- skip over motor gear
  259.   repeat while  (gearCount > 1)
  260.     -- find a gear that touches the base gear (if any exits)
  261.     if not(gearCount = theBase) then
  262.       if (sprite (theBase + initGearChannel - 1) intersects ¼
  263.            (gearCount + initGearChannel - 1)) then
  264.         -- base gear is in contact with this gear
  265.         -- gear intersection must be on horz or vert axis to engage
  266.         put the locH of sprite (theBase + initGearChannel - 1) into baseHorz
  267.         put the locH of sprite (gearCount + initGearChannel - 1) into testHorz
  268.         put the locV of sprite (theBase + initGearChannel - 1) into baseVert
  269.         put the locV of sprite (gearCount + initGearChannel - 1) into testVert
  270.         set engagedState = FALSE
  271.         if (baseHorz = testHorz) then
  272.           -- one last test, do gears overlap more then the tooth depth
  273.           -- if yes then not engaged, else engaged. The belt is a special case
  274.           -- since it engages in a different maner from gear tooth engagement
  275.           if (baseVert > testVert) then
  276.             if (the top of sprite (theBase + initGearChannel - 1) + 20 ¼
  277.                > the bottom of sprite (gearCount + initGearChannel - 1)) then
  278.               set engagedState = TRUE
  279.             end if 
  280.           else
  281.             if (the top of sprite (gearCount + initGearChannel - 1) + 20 ¼
  282.                > the bottom of sprite (theBase + initGearChannel - 1)) then
  283.               set engagedState = TRUE
  284.             end if
  285.           end if
  286.         else
  287.           if  (baseVert = testVert) then 
  288.             -- one last test, do gears overlap more then the tooth depth
  289.             -- if yes then not engaged, else engaged
  290.             if (baseHorz > testHorz) then
  291.               if (the left of sprite (theBase + initGearChannel - 1) + 20 ¼
  292.                > the right of sprite (gearCount + initGearChannel - 1)) then
  293.                 set engagedState = TRUE 
  294.               end if 
  295.             else
  296.               if (the left of sprite (gearCount + initGearChannel - 1) + 20 ¼
  297.                > the right of sprite (theBase + initGearChannel - 1)) then
  298.                 set engagedState = TRUE 
  299.               end if
  300.             end if
  301.           end if
  302.         end if
  303.         -- test if one gear is a belt, special case for belts
  304.         put getAt(gearList,theBase) into baseGear
  305.         set baseDirection = mGetDirection (baseGear)
  306.         put getAt(gearList,gearCount) into NextTestGear
  307.         set tst1 =  mGetID (baseGear)
  308.         set tst2 =  mGetID (NextTestGear)
  309.         if ((tst1 = 4 and tst2 <> 4) or ¼
  310.                (tst1 <> 4 and tst2 = 4) ) then
  311.           set engagedState = TRUE
  312.         end if
  313.         if (engagedState) then
  314.           -- OK engage the two gears
  315.           put getAt(gearList,theBase) into baseGear
  316.           set baseDirection = mGetDirection (baseGear)
  317.           put getAt(gearList,gearCount) into NextTestGear
  318.           set testEngaged = mGetEngaged   (NextTestGear)
  319.           if not(testEngaged) then          
  320.             mSetDirection (NextTestGear ,not(baseDirection))
  321.             mSetEngaged (NextTestGear ,TRUE)
  322.             set baseAltState = mGetAltState( baseGear)
  323.             --set mGetID = baseType( baseGear  ) 
  324.             --set gearType = mGetID ( NextTestGear)
  325.             mSetAltState (NextTestGear ,not(baseAltState))  --not
  326.             -- search sucessfull save the gear in the retList
  327.             setAt(retList,retIndex,gearCount)
  328.             set retIndex = retIndex + 1
  329.             setAt(retList,retIndex,0) 
  330.           end if
  331.         end if 
  332.       end if
  333.     end if
  334.     -- test the next gear
  335.     set gearCount = gearCount - 1
  336.   end repeat
  337. end mSearchBase
  338.  
  339.  
  340. --================================================================= 
  341. -- This handler is used to set the atributes of a gear offspring.
  342. -- Since the atributes of all gears are interdependent, when one
  343. -- of them changes they potentially all change. So This handler
  344. -- clears the atributes of all gear offspring in the gear list
  345. -- and then recalculates the new atributes for all gears.
  346. -- This is a complex task. To make it simpler the mSearchBase handler
  347. -- is used to automate the recursive task of searching the gear list.
  348. --  
  349. on mSetAtributes me,theSprite
  350.   put getAt(gearList,1) into motorGear
  351.   
  352.   mSetAltState (motorGear ,FALSE)
  353.   --- clear all gear engagements. (not the motor gear which is always engaged
  354.   set clearEngageCount = nGears
  355.   repeat while clearEngageCount > 1
  356.     put getAt(gearList,clearEngageCount) into nextGear
  357.     mSetEngaged (nextGear,FALSE)
  358.     set clearEngageCount = clearEngageCount - 1
  359.   end repeat
  360.   -- now find each engagement starting with the motor and working our way up
  361.   set retList1 = []
  362.   set retList2 = []
  363.   
  364.   put retList1 into listOfBases  
  365.   put retList2 into listOfNewBases
  366.   setAt(listOfNewBases,1,1)
  367.   repeat while  (getAt(listOfNewBases,1))   
  368.     -- generic loop to search, with a given base, the list of gears      
  369.     put listOfBases into holdIt --  hold this list while I switch list names
  370.     put listOfNewBases into listOfBases
  371.     put holdIt into listOfNewBases
  372.     set testBase = TRUE
  373.     set index = 1
  374.     put count(listOfBases) into nBases
  375.     
  376.     repeat while (testBase and index <= nBases)
  377.       put getAt(listOfBases,index) into testBase
  378.       if testBase then
  379.         mSearchBase (me,testBase,listOfNewBases)
  380.         set index = index + 1
  381.       end if
  382.     end repeat
  383.   end repeat
  384. end mSetAtributes
  385.  
  386. --=================================================================
  387. -- This part is only made once.
  388. on mMakeVacChute me
  389.   -- firstly, build the vac Chute
  390.   set  thisPart = birth ( script "aVacChute",22)
  391.   mAddToPartsList( me,thisPart)
  392. end mMakeVacChute
  393.  
  394. --================================================================= 
  395. on mGetPartsList me
  396.   return myPartsList
  397. end mGetPartsList
  398.  
  399. --=================================================================
  400. on  mSetPartsList me,theList
  401.   set myPartsList = theList
  402. end mSetPartsList
  403.  
  404. --================================================================= 
  405. -- The handler manages the parts list. As we add parts to the
  406. -- list we increment the nParts property var. If we reach the max
  407. -- we no longer allow parts to be added to the list and the handler
  408. -- returns FALSE. If a part is added to the list TRUE is returned.
  409. on mAddToPartsList me,thisPart 
  410.   if nParts <= maxParts then
  411.     if objectP(thisPart) then
  412.       set nParts = nParts + 1
  413.       setAt(myPartsList,nParts,thisPart)
  414.       return TRUE
  415.     else 
  416.       return FALSE
  417.     end if
  418.   else
  419.     return FALSE
  420.   end if
  421. end mAddToPartsList
  422.  
  423. --================================================================= 
  424. -- The handler manages the gear list. As we add gears to the
  425. -- list we increment the nGears property var. If we reach the max
  426. -- we no longer allow gears to be added to the list and the handler
  427. -- returns FALSE. If a gear is added to the list TRUE is returned.
  428. on mAddToGearList me,thisPart 
  429.   if nGears <= maxGears then
  430.     if objectP (thisPart) then
  431.       set nGears = nGears + 1
  432.       setAt(gearList,nGears,thisPart)
  433.       return TRUE
  434.     else 
  435.       return FALSE
  436.     end if
  437.   else
  438.     return FALSE
  439.   end if
  440. end mAddToGearList
  441.  
  442. --================================================================= 
  443. -- The handler manages the ball list. As we add ball to the
  444. -- list we increment the nGears property var. If we reach the max
  445. -- we no longer allow balls to be added to the list and the handler
  446. -- returns FALSE. If a ball is added to the list TRUE is returned.
  447. -- This version only supports one ball at present. If we wanted to
  448. -- we could extend the fucntion of the mDoBallResponse handler of the
  449. -- part offspring to managed more then one ball. At this level and up
  450. -- in the structure of MECH one or more balls are assumed. Therefore
  451. -- only the part script handlers need to be upgraded.
  452. on mIncBallNumber me
  453.   -- there is a fixed number of balls,deal with it
  454.   if nBalls < maxBalls then
  455.     set nBalls = nBalls + 1
  456.     set thisPart =  birth (script "aBall" ,nBalls + initBallChannel,myPartsList)
  457.     setAt(myBallList,nBalls,thisPart)
  458.     return thisPart
  459.   else
  460.     return 0
  461.   end if
  462. end mIncBallNumber
  463.  
  464. --=================================================================  
  465. -- This handler broadcasts the parts list to
  466. -- the balls stored in the ball list. This is necessary
  467. -- so that the balls can interact with the parts.
  468. on mBroadCastParts me
  469.   set count = 1
  470.   set delayCounter = theDelay
  471.   repeat while count <= nBalls
  472.     put getAt(myBallList,count) into thisBall
  473.     mSetPartsToTest (thisBall, nParts)
  474.     set count = count + 1
  475.   end repeat
  476. end mBroadCastParts
  477.  
  478. --=================================================================  
  479. -- This is the animation handler. The balls and gears will
  480. -- each be culled from their lists and their animation 
  481. -- handlers will be called. The deley property var is used
  482. -- to control the speed of the gear animation.
  483. on stepFrame me
  484.   -- move the ball
  485.   set count = 1
  486.   repeat while count <= nBalls 
  487.     put getAt(myBallList,count) into thisBall
  488.     mAnimateBall (thisBall)
  489.     set count = count + 1
  490.   end repeat
  491.   if delayCounter = theDelay then
  492.     set delayCounter = 0
  493.     set count = 1 
  494.     -- do   gears
  495.     repeat while count <= nGears
  496.       put getAt(gearList ,count) into thisGear
  497.       mAnimateGear (thisGear)
  498.       set count = count + 1
  499.     end repeat
  500.   else
  501.     set delayCounter = delayCounter + 1
  502.   end if
  503. end stepFrame
  504.  
  505. --================================================================= 
  506. -- This will purge everything this scrip owns. Don't call unless
  507. -- you want to start all over againg, vac chute, motor, and lists
  508. -- all need to be recreated. This handler is used so that
  509. -- the simulation can be stoped and restarted in Director without
  510. -- doing a REWIND command.
  511. on mClearActors me
  512.   mClearAllParts(me)
  513.   put getAt(myPartsList,nParts) into thisPart
  514.   set thisPart = 0
  515.   set myPartsList = 0
  516.   put getAt(gearList,nGears) into thisPart 
  517.   set thisPart = 0
  518.   set gearList = 0
  519.   set myBallList = 0
  520. end mClearActors
  521.  
  522. --================================================================= 
  523. -- bounce all the balls in the ball list
  524. on mBounceBall me
  525.   -- bounce the ball
  526.   set count = 1
  527.   repeat while count <= nBalls 
  528.     put getAt(myBallList,count) into thisBall
  529.     mBounceBall (thisBall)
  530.     set count = count + 1
  531.   end repeat
  532. end mBounceBall
  533.  
  534. --=================================================================
  535. -- This handler will code the current state of the MECH SIM into
  536. -- a string. The string can be use to write to a file.
  537. --
  538. on mGetMechSim me
  539.   -- determine, code, and save the current state of the MechSim to a string ,
  540.   --  return that string make file a header
  541.   put "MECH SIM File"&RETURN into headerStr  -- return char is the line break char
  542.   
  543.   set index = nParts
  544.   set numP = nParts -- hold this for awhile
  545.   set partSpecStr = ""
  546.   repeat while index > 1   --  don't store the vac chute
  547.     put getAt(myPartsList,index) into thisPart
  548.     if objectP(thisPart) then
  549.       set thisSprite = mGetSprite (thisPart  )     
  550.       put the locH of sprite thisSprite into thisLocH
  551.       put the locV of sprite thisSprite into thisLocV
  552.       set thisID =  mGetID (thisPart )
  553.     end if
  554.     if thisSprite > initPartChannel then      
  555.       set partSpecStr = partSpecStr &thisID & "," & thisLocH & "," & thisLocV & RETURN 
  556.     else
  557.       set numP = numP - 1
  558.     end if
  559.     set index = index - 1
  560.   end repeat
  561.   set nPartsStr = "Num of Parts ="&numP&RETURN
  562.   set retStr = headerStr&nPartsStr&partSpecStr
  563.   
  564.   set index = nGears
  565.   set retStr = retStr&"Numb of Gears ="&nGears&RETURN
  566.   repeat while index > 0 -- don't need to store the alwasy present motor gear  : jake  
  567.     put getAt(gearList,index) into thisPart
  568.     if objectP(thisPart) then
  569.       set  thisSprite = mGetSprite  (thisPart)
  570.       put the locH of sprite thisSprite into thisLocH
  571.       put the locV of sprite thisSprite into thisLocV
  572.       set thisID = mGetID (thisPart)
  573.     end if
  574.     set retStr = retStr &thisID & "," & thisLocH & "," & thisLocV & RETURN
  575.     set index = index - 1
  576.   end repeat
  577.   return retStr
  578. end mGetMechSim
  579.  
  580. --=================================================================
  581. -- Used to clear the peg board when we open a file and restore a
  582. -- saved MECH state. Also used when the user selects the clear
  583. -- peg board command (see the peg board script).
  584. on mClearAllParts me
  585.   -- clear current gears and parts, but not the Motor or Vac Chute
  586.   repeat while nParts > 1
  587.     put getAt(myPartsList,nParts) into thisPart
  588.     if objectP(thisPart) then 
  589.       set thisSprite = mGetSprite(thisPart) 
  590.       set thisPart = 0
  591.       set the constraint of sprite thisSprite = FALSE
  592.       set the locH of sprite (thisSprite) = 7000
  593.       set the locV of sprite (thisSprite) = 7000
  594.     end if
  595.     set nParts = nParts -1
  596.   end repeat
  597.   
  598.   repeat while nGears > 1
  599.     put getAt(gearList,nGears) into thisPart        
  600.     if objectP(thisPart) then
  601.       set thisSprite = mGetSprite(thisPart) 
  602.       set the constraint of sprite thisSprite = FALSE
  603.       set thisPart = 0
  604.       set the locH of sprite ( thisSprite) = -1000
  605.       set the locV of sprite (thisSprite) = -1000
  606.     end if
  607.     set nGears = nGears -1      
  608.   end repeat
  609.   set nextPChannel = initPartChannel 
  610.   set nextGChannel = initGearChannel
  611.   
  612. end mClearAllParts
  613.  
  614. --=================================================================
  615. -- Used to restore a save MECH SIM state to the peg board.
  616. --
  617. on mSetMechSim me
  618.   -- get file
  619.   put fileIO(mNew,"?read","txt") into myFile
  620.   if objectP(myFile) then
  621.     mClearAllParts (me)
  622.     -- strip the header off
  623.     put myFile(mReadLine) into headerStr      
  624.     if  (headerStr = "MECH SIM File"&RETURN) then
  625.       -- get general parts
  626.       readToStage me,myFile
  627.       -- get  the gears
  628.       readToStage me,myFile
  629.       myFile(mDispose) 
  630.       puppetTransition 23, 4, 0, 0     
  631.       upDateStage -- needed to get Director to register the new parts on the stage so that
  632.       -- we can then call mSetAtributes. mSetAtributes is uses sprite locH and locV info
  633.       mSetAtributes( me,5)
  634.       -- we need to tell the balls
  635.       mBroadCastParts(me) 
  636.     else
  637.       alert("Sorry This is not a MECH file")
  638.     end if
  639.   end if
  640. end mSetMechSim
  641.  
  642. --=================================================================
  643. -- This handler maps part IDs to part Numbers.
  644. -- They are different for historical reasons only. They could
  645. -- now be one and the same. To make this change, one would
  646. -- make have to change the calls to mNewPart and the lookup
  647. -- table in that handler.
  648. on mPartIDToPartn me,theID
  649.   if theID = chuteID     then return 5   -- chute cast
  650.   if theID = smGearID    then return 2   -- small gear
  651.   if theID = lgGearID    then return 3   -- big gear
  652.   if theID = bltGearID   then return 4   -- belt 
  653.   if theID = teeID       then return 1   -- tee Chute
  654.   if theID = pshGearID   then return 6   -- pusher
  655.   if theID = nSlopeID    then return 7   -- dwn slope
  656.   if theID = pSlopeID    then return 8   -- up slope
  657.   else return 1
  658. end mPartIDToPartn
  659.  
  660. --=================================================================
  661. -- This handler reads a stream of data, from a file
  662. -- and converts it into an part number. With the part number
  663. -- it can then create a part of that type. It then places the
  664. -- part on the peg board using the coorindates also read
  665. -- from the file.
  666.  
  667. on readToStage me,thisFile
  668.   -- get numb of parts
  669.   put thisFile(mReadChar) into myChar
  670.   put NumToChar(myChar)  into myChar
  671.   
  672.   repeat while myChar <> "="
  673.     put thisFile(mReadChar) into myChar
  674.     put NumToChar(myChar)  into myChar
  675.   end repeat
  676.   put thisFile(mReadChar) into myChar
  677.   put NumToChar(myChar)  into myChar
  678.   
  679.   put "" into pnStr    
  680.   repeat while myChar <> RETURN  
  681.     set pnStr = pnStr&myChar
  682.     put thisFile(mReadChar) into myChar  
  683.     put NumToChar(myChar)  into myChar      
  684.   end repeat
  685.   
  686.   put thisFile(mReadChar) into myChar
  687.   put NumToChar(myChar)  into myChar
  688.   put value(pnStr) into index  
  689.   -- get the parts 
  690.   set count = 1
  691.   
  692.   repeat while count < index
  693.     -- get the ID , used as an ID for the type of part
  694.     put "" into pnStr      
  695.     repeat while (myChar <> ",")
  696.       set pnStr = pnStr&myChar
  697.       put thisFile(mReadChar) into myChar
  698.       put NumToChar(myChar)  into myChar        
  699.     end repeat
  700.     put value(pnStr) into thisID
  701.     put thisFile(mReadChar) into myChar
  702.     put NumToChar(myChar)  into myChar
  703.     
  704.     -- get locH and locV
  705.     put "" into pnStr 
  706.     repeat while (myChar <> ",")
  707.       set pnStr = pnStr&myChar
  708.       put thisFile(mReadChar) into myChar
  709.       put NumToChar(myChar)  into myChar 
  710.     end repeat
  711.     put value(pnStr) into thisLocH
  712.     
  713.     put thisFile(mReadChar) into myChar
  714.     put NumToChar(myChar)  into myChar
  715.     put "" into pnStr    
  716.     
  717.     repeat while (myChar <> RETURN)
  718.       set pnStr = pnStr&myChar
  719.       put thisFile(mReadChar) into myChar
  720.       put NumToChar(myChar)  into myChar
  721.     end repeat
  722.     put value(pnStr) into thisLocV
  723.     put thisFile(mReadChar) into myChar
  724.     put NumToChar(myChar)  into myChar
  725.     
  726.     -- create the part
  727.     set partNum = mPartIDToPartn (me,thisID)
  728.     set thisSprite = mNewPart (me,partNum) 
  729.     
  730.     if thisSprite then 
  731.       --set thisSprite = mGetSprite (thisPart) 
  732.       set the locH of sprite thisSprite = thisLocH
  733.       set the locV of sprite thisSprite   = thisLocV
  734.     end if
  735.     set count = count + 1
  736.   end repeat
  737. end readToStage
  738.